Amazon CloudWatchメトリクスを取得するとき、AWS/LambdaとLambda Insightsでは関数指定のディメンション名が違う
Amazon CloudWatchアラームでAWS Lambdaのメトリクスが取れていない?
おのやんです。
みなさん、Amazon CloudWatch(以下、CloudWatch)アラームでAWS Lambda(以下、Lambda)のメトリクスが取れていない状況に遭遇したことはありませんか?私はあります。
まず、「Lambdaをメトリクスを取りたい」というケースを考えた場合、取得できるメトリクスが主に2種類あります。
ひとつがLambda標準のメトリクスです。AWS/Lambda
の名前空間で取得することができ、Lambda関数の使用率・パフォーマンス、エラー率などを取得することができます。
もうひとつはLambda Insightsのメトリクスです。Lambda関数に対して追加の設定を加えることで、CPU関係の値やデータ通知量など、より細かい数値が確認可能です。こちらはLambdaInsights
の名前空間で取得可能です。
Lambda Insightsについての細かい設定方法は、こちらのブログにまとまとまっておりますので、よければご確認ください。
これら2種類のメトリクスですが、CloudWatchアラームを設定する場合に、Lambdaをこれらのメトリクスが表示されないケースがあります。結果から言うとアラームで指定するディメンションが間違っていたのが原因なのですが、ここが結構ややこしく、間違う人は他にもいるのでは?と感じました。
ということで、今回はそんな間違いポイントを紹介します。
実際のケース
例えば以下のノリでAWS/Lambdaのメトリクスと同じようにLambdaInsightsのCloudWatchアラームを設定している場合、メモリ使用量のCloudWatchアラームではLambdaInsightsのused_memory_max
メトリクスが取れていない状態になります。
# Lambda関数用 実行時間CloudWatch Alarm
AWSTestFunctionTimeAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmActions:
- !Ref AWSTestSNSTopic
AlarmName: !Sub ${SystemName}-${EnvName}-function-time-alarm
Namespace: "AWS/Lambda"
MetricName: "Duration"
Statistic: "Average"
Period: 300
EvaluationPeriods: 1
ComparisonOperator: "GreaterThanOrEqualToThreshold"
Threshold: 600000
Dimensions:
- Name: "FunctionName"
Value: !Ref AWSTestFunction
# Lambda関数用 メモリ使用量CloudWatch Alarm
AWSTestFunctionMemoryUsageAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmActions:
- !Ref AWSTestSNSTopic
AlarmName: !Sub ${SystemName}-${EnvName}-memory-usage-alarm
Namespace: "LambdaInsights"
MetricName: "used_memory_max"
Statistic: "Average"
Period: 300
EvaluationPeriods: 1
ComparisonOperator: "GreaterThanOrEqualToThreshold"
Threshold: 7168
Dimensions:
- Name: "FunctionName"
Value: !Ref AWSTestFunction
AWS/LambdaとLambda Insightsで、関数指定のディメンション名が違う
上記のコードを見て気付いた方もいるかと思いますが、AWS/Lambda名前空間とLambdaInsights名前空間では、Lambda関数を指定する時のディメンション名が違います。具体的には、AWS/Lambda名前空間ではFunctionName
、LambdaInsights名前空間ではfunction_name
です。アッパーキャメルケースとスネークケースという違いですが、ここが違うと「データ不足」となりアラーム上でデータを取れなかったりするので、注意してください。
# Lambda関数用 実行時間CloudWatch Alarm
AWSTestFunctionTimeAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmActions:
- !Ref AWSTestSNSTopic
AlarmName: !Sub ${SystemName}-${EnvName}-function-time-alarm
Namespace: "AWS/Lambda"
MetricName: "Duration"
Statistic: "Average"
Period: 300
EvaluationPeriods: 1
ComparisonOperator: "GreaterThanOrEqualToThreshold"
Threshold: 600000
Dimensions:
- Name: "FunctionName"
Value: !Ref AWSTestFunction
# Lambda関数用 メモリ使用量CloudWatch Alarm
AWSTestFunctionMemoryUsageAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmActions:
- !Ref AWSTestSNSTopic
AlarmName: !Sub ${SystemName}-${EnvName}-memory-usage-alarm
Namespace: "LambdaInsights"
MetricName: "used_memory_max"
Statistic: "Average"
Period: 300
EvaluationPeriods: 1
ComparisonOperator: "GreaterThanOrEqualToThreshold"
Threshold: 7168
Dimensions:
- - Name: "FunctionName"
+ - Name: "function_name"
Value: !Ref AWSTestFunction
CloudWatchメトリクスは公式ドキュメントを読もう
ドキュメントを見ずにノリで実装すると結構間違うので、ちゃんと公式ドキュメントで確認してから実装するようにしてください。では!